<?php

namespace Xin\Excel;

trait HasEventBus
{

	/**
	 * @var array
	 */
	protected static $globalEvents = [];

	/**
	 * @var array
	 */
	protected $events = [];

	/**
	 * Register local event listeners.
	 *
	 * @param array $listeners
	 */
	public function registerListeners(array $listeners)
	{
		foreach ($listeners as $event => $listener) {
			$this->events[$event][] = $listener;
		}
	}

	public function clearListeners()
	{
		$this->events = [];
	}

	/**
	 * Register a global event listener.
	 *
	 * @param string $event
	 * @param callable $listener
	 */
	public static function listen(string $event, callable $listener)
	{
		static::$globalEvents[$event][] = $listener;
	}

	/**
	 * @param object $event
	 */
	public function raise($event)
	{
		foreach ($this->listeners($event) as $listener) {
			$listener($event);
		}
	}

	/**
	 * @param object $event
	 *
	 * @return callable[]
	 */
	public function listeners($event): array
	{
		$name = \get_class($event);

		$localListeners = $this->events[$name] ?? [];
		$globalListeners = static::$globalEvents[$name] ?? [];

		return array_merge($globalListeners, $localListeners);
	}

}
